#!/bin/bash
set -eu  # 保留严格模式，兼容更多系统

# 定义颜色常量
GREEN="\033[0;32m"
RED="\033[0;31m"
NC="\033[0m" # 重置颜色

# 检查是否以root权限执行
if [ "$(id -u)" -ne 0 ]; then
    echo -e "${RED}错误：请以root权限执行脚本（使用sudo）${NC}"
    exit 1
fi

# 检查参数是否足够
if [ $# -lt 1 ]; then
    echo -e "${RED}错误：请传入 server IP 作为第一个参数！${NC}"
    echo "用法：$0 <server_ip> [server_port]"
    exit 1
fi

# ==============================================
# 配置参数
# ==============================================
SERVER_IP="${1}"
SERVER_PORT="${2:-8080}"
SERVER_BASE_URL="http://${SERVER_IP}:${SERVER_PORT}/static"
AGENT_INSTALL_DIR="/opt/fastdp-agent"
CONFIG_DIR="/etc/fastdp-agent"
SYSTEMD_DIR="/etc/systemd/system"
CONFIG_FILE="${CONFIG_DIR}/config.toml"
AGENT_BIN_NAME="fastdp-agent"
AGENT_BIN_PATH="${AGENT_INSTALL_DIR}/${AGENT_BIN_NAME}"
CONFIG_EXAMPLE_NAME="config.toml.example"
SYSTEMD_SERVICE_NAME="fastdp-agent.service"
SYSTEMD_SERVICE_PATH="${SYSTEMD_DIR}/${SYSTEMD_SERVICE_NAME}"

# ==============================================
# 步骤1：停止运行中的服务（无论是否存在）
# ==============================================
echo "===== 1. 停止fastdp-agent服务 ====="
if systemctl is-active --quiet fastdp-agent; then
    echo "正在停止服务..."
    systemctl stop fastdp-agent
    echo -e "${GREEN}服务已停止${NC}"
else
    echo "服务未运行，无需停止"
fi

# ==============================================
# 步骤2：删除旧文件（确保干净的环境）
# ==============================================
echo -e "\n===== 2. 删除旧文件 ====="
# 删除agent程序
if [ -f "${AGENT_BIN_PATH}" ]; then
    rm -f "${AGENT_BIN_PATH}"
    echo -e "${GREEN}已删除旧agent程序：${AGENT_BIN_PATH}${NC}"
else
    echo "未找到旧agent程序，跳过删除"
fi

# 删除配置文件
if [ -f "${CONFIG_FILE}" ]; then
    rm -f "${CONFIG_FILE}"
    echo -e "${GREEN}已删除旧配置文件：${CONFIG_FILE}${NC}"
else
    echo "未找到旧配置文件，跳过删除"
fi

# 删除systemd服务文件
if [ -f "${SYSTEMD_SERVICE_PATH}" ]; then
    rm -f "${SYSTEMD_SERVICE_PATH}"
    echo -e "${GREEN}已删除旧systemd服务文件：${SYSTEMD_SERVICE_PATH}${NC}"
else
    echo "未找到旧systemd服务文件，跳过删除"
fi

# ==============================================
# 步骤3：创建必要目录（确保目录存在）
# ==============================================
echo -e "\n===== 3. 确保安装目录存在 ====="
mkdir -p "${AGENT_INSTALL_DIR}"
mkdir -p "${CONFIG_DIR}"
echo -e "${GREEN}目录准备完成：${AGENT_INSTALL_DIR}、${CONFIG_DIR}${NC}"

# ==============================================
# 步骤4：重新从server拉取最新文件
# ==============================================
echo -e "\n===== 4. 拉取最新文件 ====="

# 拉取配置文件示例
echo "正在拉取配置文件示例：${SERVER_BASE_URL}/${CONFIG_EXAMPLE_NAME}"
if ! curl -fSL "${SERVER_BASE_URL}/${CONFIG_EXAMPLE_NAME}" -o "${CONFIG_FILE}"; then
    echo -e "${RED}错误：拉取配置文件示例失败，请检查server地址${NC}"
    exit 1
fi
echo -e "${GREEN}配置文件示例拉取成功${NC}"

# 拉取agent可执行文件
echo "正在拉取agent程序：${SERVER_BASE_URL}/${AGENT_BIN_NAME}"
if ! curl -fSL "${SERVER_BASE_URL}/${AGENT_BIN_NAME}" -o "${AGENT_BIN_PATH}"; then
    echo -e "${RED}错误：拉取agent程序失败${NC}"
    exit 1
fi
chmod +x "${AGENT_BIN_PATH}"  # 强制设置执行权限
echo -e "${GREEN}agent程序拉取成功并设置执行权限${NC}"

# 拉取systemd服务文件
echo "正在拉取systemd服务文件：${SERVER_BASE_URL}/${SYSTEMD_SERVICE_NAME}"
if ! curl -fSL "${SERVER_BASE_URL}/${SYSTEMD_SERVICE_NAME}" -o "${SYSTEMD_SERVICE_PATH}"; then
    echo -e "${RED}错误：拉取systemd服务文件失败${NC}"
    exit 1
fi
echo -e "${GREEN}systemd服务文件拉取成功${NC}"

# ==============================================
# 步骤5：自动获取本机AGENT_IP
# ==============================================
echo -e "\n===== 5. 获取本机AGENT_IP ====="
SERVER_PREFIX=$(echo "${SERVER_IP}" | cut -d '.' -f 1-3)

# 方法1：优先同网段IP
AGENT_IP=$(ip addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '^127\.' | grep "^${SERVER_PREFIX}\." | head -n 1)

# 方法2：fallback到其他有效IP
if [ -z "${AGENT_IP}" ]; then
    echo "未找到同网段IP，尝试获取其他有效IP..."
    AGENT_IP=$(ip addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '^127\.' | head -n 1)
fi

if [ -z "${AGENT_IP}" ]; then
    echo -e "${RED}错误：无法自动获取本机IP，请手动配置${NC}"
    exit 1
fi
echo -e "${GREEN}本机AGENT_IP：${AGENT_IP}${NC}"

# ==============================================
# 步骤6：更新配置文件（强制覆盖，因为文件是新拉取的）
# ==============================================
echo -e "\n===== 6. 配置文件处理 ====="

# 处理host（agent本机IP）
if grep -q "^host = " "${CONFIG_FILE}"; then
    sed -i "s/^host = \".*\"/host = \"${AGENT_IP}\"/g" "${CONFIG_FILE}"
else
    sed -i "/\[fastdp-agent\]/a host = \"${AGENT_IP}\"" "${CONFIG_FILE}"
fi
echo -e "${GREEN}已设置host：${AGENT_IP}${NC}"

# 处理rpcserver_host（server IP）
if grep -q "^rpcserver_host = " "${CONFIG_FILE}"; then
    sed -i "s/^rpcserver_host = \".*\"/rpcserver_host = \"${SERVER_IP}\"/g" "${CONFIG_FILE}"
else
    sed -i "/\[fastdp-agent\]/a rpcserver_host = \"${SERVER_IP}\"" "${CONFIG_FILE}"
fi
echo -e "${GREEN}已设置rpcserver_host：${SERVER_IP}${NC}"

# ==============================================
# 步骤7：重新启动服务并设置开机自启
# ==============================================
echo -e "\n===== 7. 启动服务 ====="
systemctl daemon-reload  # 重新加载服务配置（因为服务文件可能已更新）
systemctl enable --now fastdp-agent

# 最终状态检查
if systemctl is-active --quiet fastdp-agent; then
    echo -e "\n${GREEN}===== 操作完成！服务已重新部署并启动 ====="
    echo "配置文件：${CONFIG_FILE}"
    echo "本机AGENT_IP自动获取为：${AGENT_IP}，如果不符合预期请修改配置文件"
    echo "日志查看：journalctl -u fastdp-agent -f${NC}"
else
    echo -e "\n${RED}===== 错误：服务启动失败！查看日志：journalctl -u fastdp-agent -f ====="
    exit 1
fi